export const mark = `# 需求设计文档

## 项目概述

### 项目名称：

博客系统设计

### 项目描述：

博客系统是一个面向个人或团体的网络平台，用于发布、管理和分享文章、观点和见解。该系统旨在为用户提供一个简单易用的平台，使他们能够轻松创建个人博客、撰写文章、与读者互动并分享他们的知识和经验。博客系统将提供用户注册、登录、文章管理、评论、分类标签、搜索等功能，以及响应式设计，适应不同设备的访问。

### 项目目标：

1. **提供用户友好的博客平台体验**：
    - 目标是为用户提供一个简单易用的博客平台，让他们能够轻松创建、编辑和管理自己的博客，同时享受到良好的用户界面和交互体验。
2. **促进内容创作和分享**：
    - 目标是鼓励用户创作高质量的内容，并提供分享机制，让用户的文章可以被更多人看到和分享，从而增加平台的内容丰富度和吸引力。
3. **建立互动社区**：
    - 目标是打造一个活跃的博客社区，通过评论、点赞和分享等功能，促进用户之间的交流和互动，增强用户粘性和平台活跃度。
4. **提供个性化定制和推荐**：
    - 目标是根据用户的兴趣和行为，提供个性化的内容推荐和定制化的服务，让用户能够更快速地找到符合自己兴趣的内容，并提高用户留存和满意度。
5. **确保安全和稳定性**：
    - 目标是保障用户数据的安全和隐私，防范各类网络安全威胁，同时确保系统的稳定性和可靠性，提供良好的服务保障和用户信任。
6. **持续改进和创新**：
    - 目标是不断优化和改进博客系统的功能和性能，借鉴行业最佳实践，引入新技术和功能，以满足用户不断变化的需求和市场竞争的挑战。

## 功能需求

### 功能一：登录/注册

#### 描述：

该功能允许用户通过手机号、密码或电子邮箱号、密码进行登录，并且在需要时可以注册新账户。用户也可以通过手机号和短信验证码，或者电子邮箱号和电子邮箱验证码进行登录，系统将根据验证方式自动注册新用户。

#### 输入：

- 手机号
- 密码
- 电子邮箱号
- 电子邮箱验证码
- 短信验证码

#### 处理：

1. 用户输入手机号和密码，系统验证用户信息，若验证通过，则登录成功。（该方式不支持自动注册，注册一定需要手机号+验证码才能注册）
2. 用户输入电子邮箱号和密码，系统验证用户信息，若验证通过，则登录成功。（该方式不支持自动注册，注册一定需要电子邮箱号+验证码才能注册）
3. 用户输入手机号和短信验证码，系统验证验证码，若验证通过，则登录成功；若用户不存在，则自动注册新账户。
4. 用户输入电子邮箱号和电子邮箱验证码，系统验证验证码，若验证通过，则登录成功；若用户不存在，则自动注册新账户。

#### 输出：

- 登录成功：用户进入系统并可使用系统功能。
- 注册成功：用户成功注册并自动登录系统。
- 验证码错误：用户输入的验证码有误，请重新输入。
- 用户不存在：仅在使用验证码登录时，系统自动注册新账户，并登录系统。
- 登录失败：用户输入的账号或密码有误，请重新输入。

#### 示例：

1. 用户输入手机号和密码，点击登录按钮，系统验证通过，用户成功登录。
2. 用户输入电子邮箱号和密码，点击登录按钮，系统验证通过，用户成功登录并进入系统。
3. 用户输入手机号和短信验证码，点击登录按钮，系统验证通过，但用户不存在，系统自动注册新账户并登录系统。

### 功能二：个人模块

#### 描述：

个人模块允许用户在登录成功后查看和修改其个人信息，包括账号ID、头像、昵称、绑定的手机号、电子邮箱号、账号创建时间、性别等基础信息。用户也可以对个人信息进行修改，包括上传/修改头像、修改昵称、修改性别等操作。此外，用户还可以查看已发布的博客数量、保存但未发表的博客数量以及垃圾箱的博客数量，并进行相应的管理操作。

#### 输入：

- 用户登录状态（确保用户已登录）

#### 处理：

1. 检查用户登录状态，若未登录，则返回登录页面。
2. 查询用户的基础信息，如账号ID、头像、昵称、绑定的手机号、电子邮箱号、账号创建时间、性别等。
3. 查询用户已发布的博客数量、保存但未发表的博客数量以及垃圾箱的博客数量。
4. 提供接口供用户修改个人信息，包括上传/修改头像、修改昵称、修改性别等。
5. 提供接口供用户解绑绑定的邮箱号和手机号，但至少保留一项绑定信息。
6. 提供接口供用户修改密码。

#### 输出：

- 用户基础信息：账号ID、头像、昵称、绑定的手机号、电子邮箱号、账号创建时间、性别等。
- 已发布的博客数量。
- 保存但未发表的博客数量。
- 垃圾箱的博客数量。
- 修改成功：用户成功修改个人信息。
- 解绑成功：用户成功解绑绑定的邮箱号或手机号。
- 修改密码成功：用户成功修改密码。
- 未登录：用户尚未登录，请先登录后再访问个人模块。

#### 示例：

1. 用户登录后，进入个人模块，查看到自己的基础信息以及已发布的博客数量、保存但未发表的博客数量以及垃圾箱的博客数量。

2. 用户上传新头像，修改昵称为新昵称，点击保存，个人信息成功修改。

3. 用户解绑手机号，系统提示至少保留一项绑定信息，用户选择取消操作。

4. 用户修改密码为新密码，系统提示密码修改成功。

    

    ### 功能四：首页展示

    #### 描述：

    首页展示是博客系统的入口页面，以单列方式展示博客列表，每个博客项包括博客图、标题和简要内容。该功能无需登录即可查看，顶部有导航条，其中默认选中首页。在右上角，根据用户登录状态，显示登录/注册按钮或个人头像。中部区域显示博客列表，采用懒加载方式，当用户滚动页面时，自动加载下一页的博客列表。中部区域右侧显示个人登录信息（若未登录则不显示），之后显示备案信息，备案信息无论如何都要显示。

    #### 输入：

    - 无需登录即可查看

    #### 处理：

    1. 加载首页内容，采用懒加载方式，显示第一页的博客列表。
    2. 每个博客项包括博客图、标题和简要内容。
    3. 当用户滚动页面时，自动加载下一页的博客列表。
    4. 在顶部导航条中，高亮显示当前选中的页面（默认选中首页）。
    5. 根据用户登录状态，右上角显示登录/注册按钮或个人头像。
    6. 若用户已登录，则右侧显示个人登录信息，包括用户名或昵称。
    7. 显示备案信息，确保备案信息无论如何都要显示。
    8. 当用户滚动页面一定距离时，右下角出现向上箭头，点击后滚动到页面顶部。

    #### 输出：

    - 首页内容：以单列方式展示博客列表，每个博客项包括博客图、标题和简要内容。
    - 导航条：高亮显示当前选中的页面，包括首页。
    - 登录/注册按钮：右上角显示登录/注册按钮（未登录状态）或个人头像（已登录状态）。
    - 个人登录信息：显示用户的登录信息（已登录状态）。
    - 备案信息：显示网站的备案信息。
    - 滚动至顶部箭头：右下角显示向上箭头，点击后滚动到页面顶部。

    #### 示例：

    1. 用户访问首页，加载第一页的博客列表，每个博客项包括博客图、标题和简要内容。
    2. 当用户滚动页面时，自动加载下一页的博客列表。
    3. 顶部导航条高亮显示首页。
    4. 右上角显示登录/注册按钮或个人头像，根据用户登录状态而定。
    5. 若用户已登录，则右侧显示个人登录信息。
    6. 显示备案信息，确保备案信息无论如何都要显示。
    7. 当用户滚动页面一定距离时，右下角出现向上箭头，点击后滚动到页面顶部。

    ### 功能五：博客详情页

    #### 描述：

    博客详情页允许用户点击博客项后查看详细的博客信息。后端返回的博客内容为Markdown语法，前端需要将其转换为HTML进行显示。在博客内容下方提供评论功能，用户可以查看评论（无需登录），但必须登录后才能发布评论。

    #### 输入：

    - 用户点击某个博客项查看详情

    #### 处理：

    1. 用户点击博客项后，前端向后端请求博客详情信息。
    2. 后端返回博客详情，包括标题、内容（Markdown格式）以及评论信息。
    3. 前端将Markdown格式的内容转换为HTML，并显示在页面上。
    4. 用户可以浏览博客内容下方的评论区，查看其他用户的评论。
    5. 若用户已登录，显示评论输入框和提交按钮，用户可以输入评论内容并提交。
    6. 若用户未登录，评论区显示登录提示，提示用户登录后才能评论。

    #### 输出：

    - 博客详情信息：包括标题、内容（转换为HTML格式）和评论列表。
    - 评论功能：评论区域显示其他用户的评论，若用户已登录，显示评论输入框和提交按钮；若用户未登录，显示登录提示。

    #### 示例：

    1. 用户点击某个博客项，进入博客详情页。

    2. 前端请求后端获取博客详情信息。

    3. 后端返回博客标题、内容和评论信息。

    4. 前端将Markdown格式的博客内容转换为HTML，并显示在页面上。

    5. 用户可以浏览评论区，查看其他用户的评论。

    6. 若用户已登录，显示评论输入框和提交按钮，用户可以输入评论内容并提交。

    7. 若用户未登录，评论区显示登录提示，提示用户登录后才能评论。

        

        ### 功能六：新建/编辑博客

        #### 描述：

        编辑博客功能允许用户新建或编辑已有的博客内容。前端提供编辑器界面，用户可以在编辑器中输入博客内容，并支持将输入的内容转换为Markdown格式数据传递给后端。用户可以上传图片，后端会返回一个URL表示该图片的链接，用户可以在博客内容中插入图片链接。

        #### 输入：

        - 用户选择新建博客或编辑已有博客
        - 用户在编辑器中输入或编辑博客内容
        - 用户上传图片

        #### 处理：

        1. 用户选择新建博客或编辑已有博客。
        2. 用户在编辑器界面中输入或编辑博客内容。
        3. 用户可以上传图片，前端将图片上传至后端。
        4. 后端接收图片，并将其存储，返回图片的URL链接给前端。
        5. 前端将用户输入的博客内容以及图片链接转换为Markdown格式数据，并传递给后端。
        6. 后端接收Markdown格式的博客内容，并进行存储或编辑已有博客。

        #### 输出：

        - 新建/编辑成功：用户成功新建或编辑博客。
        - 图片URL链接：后端返回的图片链接，用于插入博客内容中的图片。

        #### 示例：

        1. 用户选择新建博客，进入编辑器界面。
        2. 用户在编辑器中输入博客标题和内容，同时可以插入图片。
        3. 用户上传图片，前端将图片发送给后端。
        4. 后端接收图片并存储，返回图片的URL链接。
        5. 用户点击保存按钮，前端将博客内容以及图片链接转换为Markdown格式数据，并发送给后端。
        6. 后端接收到Markdown格式的博客内容，存储新建的博客。

        ### 功能七：博客后台管理

        #### 描述：

        博客后台管理功能允许管理员对博客进行管理，包括禁用博客、审核编辑内容。在博客详情页中，管理员身份用户可以看到管理按钮，通过按钮可以对博客进行禁用操作。被禁用的博客将不会在首页博客列表中显示，但会在博主的被禁用博客列表中显示。博主编辑博客内容后，需要提交审核，审核通过后的内容将显示在管理员可见的顶部的审核页面中。

        #### 输入：

        - 管理员身份用户点击博客详情页中的管理按钮
        - 博主编辑博客内容并提交审核

        #### 处理：

        1. 在博客详情页中，管理员身份用户可以看到管理按钮。
        2. 管理员点击管理按钮，弹出管理菜单，包括禁用博客选项。
        3. 管理员选择禁用博客，前端向后端发送禁用请求。
        4. 后端接收禁用请求，将博客标记为禁用状态，不再在首页博客列表中显示。
        5. 被禁用的博客将在博主的被禁用博客列表中显示。
        6. 博主编辑博客内容后，提交审核。
        7. 管理员审核通过博客内容，将其发布，显示在顶部的审核页面中（仅管理员可见）。

        #### 输出：

        - 禁用成功：博客被成功禁用。
        - 审核通过：博客编辑内容审核通过，已发布。

        #### 示例：

        1. 管理员身份用户进入博客详情页，点击管理按钮。
        2. 弹出管理菜单，选择禁用博客选项。
        3. 前端向后端发送禁用请求，后端接收并处理请求，将博客标记为禁用状态。
        4. 被禁用的博客不再在首页博客列表中显示，但会在博主的被禁用博客列表中显示。
        5. 博主编辑博客内容并提交审核。
        6. 管理员审核通过博客内容，将其发布，显示在管理员可见的顶部的审核页面中。

### 性能需求

#### 性能指标：

- 系统响应平均响应在500ms-1000ms 之间，最大不能超过10s,超过10s 显示操作超时

### 可用性需求

#### 可用性指标：

- 页面使用响应式的方式显示，页面需要兼容 iPad、笔记本（14寸）、台式电脑尺寸的屏幕显示

### 安全性需求

#### 安全性指标：

- 本系统必须使用签名的方式请求后台数据，具体签名如下

    1. 对于用户登录，修改密码等关键信息，必须采用RSA加密的方式进行请求数据
        具体操作如下：

        1. 前端请求接口获取加密的密钥RSA公钥
        2. 拿到公钥后，采用PKCS #1标准进行加密
        3. 传入到后端，后端进行解密得到原文信息
        4. 后端进行逻辑操作后，如果是登录则会返回Token 和 UserId（明文返回）

    2. 对于得到Token后的操作，采用以下签名方式

        1. 签名因子：userid + timestamp（毫秒级） + nonce(随机数) + Token + Body(请求体内容)

        2. 对签名因子进行加密（MD5）得到签名（signature）

        3. 请求头必传 userid 、timestamp、nonce、signature

            

## 技术栈

### 后端技术：

- .NET 8.0 / EF Core / Redis 

### 前端技术：

- React.js / Vue.js（最好使用React）

### 数据库技术：

- MySQL 5.7.18-log（主从分离）

## 项目交付

### 交付日期：

尽快

### 交付物：

- 前端需要前端代码，进行部署

## 其他说明

Logo 标题使用微雨知，如需要Logo 图标请联系我，该项目用于毕业设计，因此可以的话尽可能告诉我前端用了什么技术栈，React、Reduce、Hock等。后端正在开发中，尽可能同步开发。`